import os
import json
import logging
import traceback
import requests
from datetime import datetime
from flask import Response, stream_with_context

# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# Ollama API配置
OLLAMA_API_ENDPOINT = 'http://127.0.0.1:11434/api/chat'
MODEL_NAME = "deepseek-r1:8b"

# 系统提示词配置
SYSTEM_PROMPT = """
你是一个专业的垃圾分类助手，能够帮助用户解答各种垃圾分类相关的问题。

回答格式要求：
1. 思考过程：
   - 首先输出"思考过程:"（必须带冒号）后换行
   - 详细展示你的推理步骤
   - 每个推理步骤都应单独成段
   - 使用简单的标点符号

2. 正式回答：
   - 在思考过程结束后，输出"回答:"（必须带冒号）后换行
   - 给出清晰、结构化的答案
   - 每个重要部分之间空一行
   - 重要标题（如"分类原因："、"处理建议："等）独立成行
   - 如果有列举内容，每条单独成行并使用数字编号
   - 核心内容用【】括起来

3. 用户打招呼时直接回复：
   "您好！我是您的智能垃圾分类助手，可以为您提供以下帮助：
   1. 询问垃圾分类相关的任何问题
   2. 寻求对特定物品的分类建议
   3. 了解垃圾分类的环保小知识
   请问您想了解什么呢？"

示例回答格式：
思考过程:
这个问题涉及到厨余垃圾和其他垃圾的区分。
我需要从环保和资源利用的角度来分析。
首先，厨余垃圾具有特殊的处理价值...
其次，混合处理会造成资源浪费...

回答:
【厨余垃圾和其他垃圾分开处理的主要原因】

资源利用价值：
1. 厨余垃圾可以制成有机肥料
2. 通过发酵可以产生沼气
3. 实现资源的循环利用

环境保护原因：
1. 避免污染土壤和地下水
2. 减少温室气体排放
3. 降低填埋场压力

处理建议：
1. 确保厨余垃圾干湿分离
2. 定期投放，避免积累
3. 使用专门的收集容器
"""

# 请求配置
REQUEST_CONFIG = {
    "stream": True,  # 启用流式响应
    "temperature": 1.3,  # 温度参数，控制输出的随机性
}

def parse_line(line):
    """解析响应行中的JSON数据"""
    try:
        # 解析JSON
        data = json.loads(line)
        return data
    except json.JSONDecodeError:
        logger.error(f"JSON解析错误: {line}")
        return None

def generate_chat_stream(user_message):
    """流式生成聊天回复"""
    try:
        data = {
            "model": MODEL_NAME,
            "messages": [
                {"role": "system", "content": SYSTEM_PROMPT},
                {"role": "user", "content": user_message}
            ],
            **REQUEST_CONFIG
        }

        response = requests.post(
            OLLAMA_API_ENDPOINT,
            json=data,
            stream=True,
            timeout=60
        )
        
        if response.status_code != 200:
            yield json.dumps({"error": f"API调用失败: {response.status_code}"})
            return

        current_content = ""
        
        for line in response.iter_lines():
            if not line:
                continue

            data = parse_line(line)
            if not data:
                continue

            # 获取内容
            content = data.get('message', {}).get('content', '')
            if content:
                current_content = content
                yield json.dumps({
                    "type": "content",
                    "content": content
                })

            # 检查是否完成
            if data.get('done', False):
                break

        # 发送完成标记
        yield json.dumps({"type": "done"})
        
    except Exception as e:
        logger.error(f'发生错误: {str(e)}')
        logger.error(f'错误堆栈: {traceback.format_exc()}')
        yield json.dumps({"error": "处理请求时发生错误"})

def chat_with_deepseek(user_message):
    """处理聊天请求并返回流式响应"""
    return Response(
        stream_with_context(generate_chat_stream(user_message)),
        mimetype='application/json'
    )